package com.jt.www.queue.process;

import com.jt.www.model.issue.entity.IssuePolicyLogEntity;
import com.jt.www.model.issue.entity.IssueRecordEntity;
import com.jt.www.model.vo.endorse.AppDetailProVo;
import org.dom4j.Element;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * 电子保单和电子发票通用的接口，需要的时候继承
 */
@Service
public abstract class ElecPolicyProcessAbstract {

    /**
     * 主方法执行电子保单下载
     *
     * @param rootElement
     * @param ifCode
     * @return
     */
    public abstract Boolean process(Element rootElement, String ifCode);

    /**
     * 解析返回报文xml
     *
     * @param rootElement
     * @return
     */
    public abstract Element getRespPacket(Element rootElement);

    /*
     * 解析返回请求报文xml
     * @param document 文档对象
     * @return 返回dom元素
     */
    public abstract Element getReqPacket(Element rootElement);

    /**
     * 根据投保单号查询是否已经入库
     *
     * @param appCode
     * @return
     */
    public abstract Boolean judgingStorage(String appCode);


    /**
     * 适用于大地保险公司电子保单
     *
     * @param applicationFormCode
     * @param url
     * @return
     */
    public abstract String getNewUrl(String applicationFormCode, String url);

    /*
     * 绑定资源，更新下载状态
     * @param applicationFormCode 投保单号
     * @param fileId             文件id
     */
    public abstract void bindingResources(String applicationFormCode, String fileId, IssuePolicyLogEntity issuePolicyLogEntity) throws Exception;

    /**
     * 发送邮件
     *
     * @param tbNo
     * @param type
     */
    public abstract void sendEmail(String tbNo, String type);

    /**
     * 获取电子发票类型,以及发票信息
     *
     * @param appCode
     * @return
     */
    public abstract Map<String, String> getAppcodeInvoiceType(String appCode);

    /**
     * 判断金额是否小于10w，10w之内才能开具电子发票
     *
     * @param fee
     * @return
     */
    public abstract Boolean judgingTheAmount(String fee);

    /**
     * 出单成功 生成消息
     *
     * @param productName
     * @param tbNo
     * @param policyNo
     * @param holderCode
     */
    public abstract void createMessage(String productName, String tbNo, String policyNo, String holderCode);

    /**
     * 根据投保单号远程获取详情
     *
     * @param appCode
     * @return
     */
    public abstract AppDetailProVo insAppDetailList(String appCode);

    /**
     * 绑定发票资源，更新下载状态
     *
     * @param applicationFormCode 投保单号
     * @param fileId              文件id
     */
    public abstract void bindInvoice(String applicationFormCode, String fileId, IssuePolicyLogEntity issuePolicyLogEntity) throws Exception;

    /**
     * 入主表数据issueRecordEntity
     *
     * @param ifCode
     * @param policyNo
     * @param proCode
     * @param reqPacket
     * @param respPacket
     * @param status
     * @param ifCode
     */
    public abstract IssueRecordEntity insertIssueRecordEntity(String tbNo, String policyNo, String proCode, Element reqPacket, Element respPacket, String status, String ifCode, String currentTime);

    public abstract IssuePolicyLogEntity insertIssuePolicyLogEntity(String tbNo, String policyNo, String proCode, String status, String ifCode, String currentTime, Element info);

    /**
     * 根据状态码获取是否继续
     *
     * @param status
     * @return
     */
    public abstract Boolean judgingStatus(String status);


}
